#!/usr/bin/env python3
"""
libldb MCP Server

面向软件：libldb (LDAP 数据库库)
提供对 libldb 相关命令行工具的封装，使 AI 能够安全调用 LDAP 操作。

MCP tools 列表：
1. ldb_ldapadd_config - 通过 LDIF 文件修改 LDAP 配置
   参数：ldif_content (str) - LDIF 文件内容
   返回：统一 JSON 结构

2. ldb_ldapsearch_base - 执行 LDAP 搜索查询
   参数：base_dn (str) - 搜索基准 DN, host (str) - LDAP 服务器地址
   返回：统一 JSON 结构
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import tempfile
import os

mcp = FastMCP("libldb MCP Server")

@mcp.tool()
def ldb_ldapadd_config(ldif_content: str, context: Context) -> dict:
    """
    通过 LDIF 文件内容修改 LDAP 配置
    
    参数:
        ldif_content: LDIF 文件内容字符串，包含要修改的配置信息
        
    返回:
        JSON 结构: {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 创建临时文件保存 LDIF 内容
        with tempfile.NamedTemporaryFile(mode='w', suffix='.ldif', delete=False) as f:
            f.write(ldif_content)
            ldif_file = f.name
        
        # 执行 ldapadd 命令
        cmd = ['ldapadd', '-Y', 'EXTERNAL', '-H', 'ldapi:///', '-f', ldif_file]
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        # 清理临时文件
        os.unlink(ldif_file)
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
        
    except Exception as e:
        return {
            "success": False,
            "command": f"ldapadd with LDIF content",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def ldb_ldapsearch_base(base_dn: str, host: str = "ldap://127.0.0.1", context: Context) -> dict:
    """
    执行基本的 LDAP 搜索查询
    
    参数:
        base_dn: 搜索的基准 DN (Distinguished Name)
        host: LDAP 服务器地址，默认为 ldap://127.0.0.1
        
    返回:
        JSON 结构: {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 执行 ldapsearch 命令
        cmd = ['ldapsearch', '-x', '-b', base_dn, '-H', host]
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(cmd),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
        
    except Exception as e:
        return {
            "success": False,
            "command": f"ldapsearch -b {base_dn} -H {host}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()